home *** CD-ROM | disk | FTP | other *** search
- {*********************************************************}
- {* TstRndU2 *}
- {* Copyright (c) Julian M Bucknall 1998 *}
- {* All rights reserved. *}
- {*********************************************************}
- {* Random number test program - generators *}
- {*********************************************************}
-
- {Note: this unit is released as freeware. In other words, you are free
- to use this unit in your own applications, however I retain all
- copyright to the code. JMB}
-
- {$X+}
-
- unit TstRndU2;
-
- interface
-
- type
- TRandomGenerator = function : double;
- {-type of a random number generator for our tests}
-
- var
- AlgorithmKSeed : longint; {Seed for Algorithm K}
-
- function SystemRandom : double;
- {-the system random routine}
- function AlgorithmK : double;
- {-algorithm K: a flawed linear congruential generator}
- function AdditiveGenerator : double;
- {-an additive generator}
-
- procedure InitializeAdditiveGenerator;
- procedure DestroyAdditiveGenerator;
-
- implementation
-
- const
- RandArraySize = 55;
-
- type
- PRandArray = ^TRandArray;
- TRandArray = array [0..pred(RandArraySize)] of longint;
-
- const
- Inx1 : integer = 0;
- Inx2 : integer = 0;
- RArray : PRandArray = nil;
-
- function SystemRandom : double;
- begin
- Result := Random;
- end;
-
- function AlgorithmK : double;
- begin
- if (AlgorithmKSeed = 0) then
- AlgorithmKSeed := 1;
- AlgorithmKSeed := (AlgorithmKSeed * 31415927) mod 27182819;
- Result := abs(AlgorithmKSeed) / 27182819.0;
- end;
-
- function AdditiveGenerator : double;
- begin
- if (RArray = nil) then begin
- Result := 0.0;
- Exit;
- end;
- RArray^[Inx1] := RArray^[Inx1] + RArray^[Inx2];
- Result := (RArray^[Inx1] shr 1) / 2147483648.0;
- inc(Inx1);
- if (Inx1 = 55) then
- Inx1 := 0;
- inc(Inx2);
- if (Inx2 = 55) then
- Inx2 := 0;
- end;
-
- procedure InitializeAdditiveGenerator;
- var
- i : integer;
- R : double;
- begin
- if (RArray = nil) then begin
- New(RArray);
- for i := 0 to pred(RandArraySize) do begin
- R := Random; {throw away the result-we just need the 32-bit value}
- RArray^[i] := RandSeed;
- end;
- Inx1 := 0;
- Inx2 := 33;
- end;
- end;
-
- procedure DestroyAdditiveGenerator;
- begin
- if (RArray <> nil) then begin
- Dispose(RArray);
- RArray := nil;
- end;
- end;
-
- end.
-